# 字典类型
# 字典是另一种可变容器模型，且可存储任意类型对象。
# 字典的每个键值(key=>value)对用冒号(:)分割，每个对之间用逗号(,)分割，整个字典包括在花括号({})中 ,格式如下所示
# d = {key1: value1, key2: value2}
# 键必须是唯一的，但值则不必

# 创建字典
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
dict1 = {'abc': 456}
dict2 = {'abc': 123, 98.6: 37}
print(dict)  # {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
print(dict1)  # {'abc': 456}
print(dict2)  # {'abc': 123, 98.6: 37}

# 访问单个字典数据
print("dict['Alice'] = ", dict['Alice'])  # dict['Alice'] =  2341
# 如果用字典里没有的键访问数据，会输出错误
# print("dict['Alice1'] = ", dict['Alice1'])  # KeyError: 'Alice1'

# 增加  d.setdefault(m,n) 查询有则返回无则添加m:键 n:值
d = dict.setdefault('hello', 'world')
print(d)  # world
# d=dict.fromkeys(m,n) m:键的来源可迭代对象 n:设置值的默认值
fromkeys = dict.fromkeys(dict2, 0)
print(fromkeys)  # {'abc': 0, 98.6: 0}

# 删除
dict = {'Name': 'taobao', 'Age': 7, 'Class': 'First'}
del dict['Name']  # 删除键 'Name'
print(dict)  # {'Age': 7, 'Class': 'First'}
dict.clear()  # 清空字典
print(dict)  # {}
del dict  # 删除字典
# print("dict['Age']: ", dict['Age']) # TypeError: 'type' object is not subscriptable
# print("dict['School']: ", dict['School'])

# d.pop(m) m:键 删除以m为键的字典
dict = {'Name': 'taobao', 'Age': 7, 'Class': 'First'}
dict.pop('Class')
print(dict)  # {'Name': 'taobao', 'Age': 7}

# d.popitem() 删除最后一个字典
dict.popitem()
print(dict)  # {'Name': 'taobao'}

# 修改
dict = {'Name': 'taobao', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8  # 更新 Age
dict['School'] = "小鸟"  # 添加信息
print("dict['Age']: ", dict['Age'])  # dict['Age']:  8
print("dict['School']: ", dict['School'])  # dict['School']:  小鸟

# 查寻
d = {'Name': 'taobao', 'Age': 7, 'Class': 'First'}
print(d.get('Name'))  # m:键 返回m键对应的值 taobao
print(d.keys())  # 获得键的列表 dict_keys(['Name', 'Age', 'Class'])
print(d.values())  # 获得值的列表 dict_values(['taobao', 7, 'First'])
print(d.items())  # 同时获得键与值的元组 再通过遍历获得键与值 dict_items([('Name', 'taobao'), ('Age', 7), ('Class', 'First')])

# 内置的方法 更多的方法请参见 思维导图此模块
d = {'Name': 'taobao', 'Age': 7, 'Class': 'First'}
print(len(d))  # 3
